package java行为型设计模式.空对象模式;

/**
 *在空对象模式中，创建一个无业务对象，包括 null 对象。
 *
 * 我们使用无业务对象来替换空指针检查。
 *
 * 我们称之为一个无业务的对象Null对象。
 *
 * Null对象在数据不可用时提供默认行为。
 *
 * 在空对象模式中，我们通常创建一个抽象类来指定各种操作。
 *
 * Null Object和具体类都将扩展这个抽象类。
 *
 * Null Object类只提供空逻辑。
 */
public class Main {
    public static void main(String[] args) {
        AbstractEmployee emp = EmployeeFactory.getCustomer("Rob");
        AbstractEmployee emp2 = EmployeeFactory.getCustomer("Bob");
        AbstractEmployee emp3 = EmployeeFactory.getCustomer("Jack");
        AbstractEmployee emp4 = EmployeeFactory.getCustomer("Tom");

        System.out.println(emp.getName());
        System.out.println(emp2.getName());
        System.out.println(emp3.getName());
        System.out.println(emp4.getName());
    }
}
abstract class AbstractEmployee{
    protected String name;
    public abstract boolean isNull();
    public abstract String getName();
}
class Programmer extends AbstractEmployee{
    public Programmer(String name){
        this.name = name;
    }

    @Override
    public boolean isNull() {
        return false;
    }

    @Override
    public String getName() {
        return name;
    }
}
class NullCustomer extends AbstractEmployee{
    @Override
    public boolean isNull() {
        return true;
    }

    @Override
    public String getName() {
        return "Not Available";
    }
}
class EmployeeFactory{
    public static final String[] names = {"Rob","Joe","Jack"};
    public static AbstractEmployee getCustomer(String name){
        for (int i = 0; i < name.length(); i++) {
            if (names[i].equalsIgnoreCase(name)){
                return new Programmer(name);
            }
        }
        return new NullCustomer();
    }
}
